# 在requests session中手动设置cookie

最近在使用python requests库时遇到一个问题,就是如何在session中设置对所有请求都生效的cookie?requests中的session对象一大特性就是它会自动管理cookie,当你登录一个页面时,它可以自动识别response中的set cookie头,然后为下面的请求一直维持这个cookie。不过在使用的过程中,因为目标网站登录有验证码,所以打算每次运行时手动登录页面获取cookie,然后再把cookie写到代码变量中。这里遇到的问题就是当在get函数中传入cookie变量时,cookie只对当前的请求进行生效,下一次调用get还需要再传入一次cookie,否则发出去的请求是默认不会带有cookie的。

如:

import requests
import timemycookie = { "PHPSESSID":"56v9clgo1kdfo3q5q8ck0aaaaa" }
x = requests.session()
x.get("http://127.0.0.1:80",cookies = mycookie)
time.sleep(5)
x.get("http://127.0.0.1:80")
1
2
3
4
5
6

运行脚本后,通过抓包发现,第一次get请求的中含有自定义的cookie,第二次请求中却没有。因为要对很多http接口发送请求,所以如果在每个get里面都加入一个cookie变量的话,写起来就有些麻烦了。于是google了一下,解决方法如下:

import requests
import timemycookie = { "PHPSESSID":"56v9clgo1kdfo3q5q8ck0aaaaa" }
x = requests.session()
requests.utils.add_dict_to_cookiejar(x.cookies,{"PHPSESSID":"07et4ol1g7ttb0bnjmbiqjhp43"})
x.get("http://127.0.0.1:80",cookies = mycookie)
time.sleep(5)
x.get("http://127.0.0.1:80")
1
2
3
4
5
6
7

这样,通过requests.utils.add_dict_to_cookiejar对session对象设置cookie,之后所有的请求都会自动加上自定义的cookie内容。

也可以通过requests.utils.cookiejar_from_dict 先生成一个cookiejar对象,时候在赋值给session.cookies。貌似还可以使用session.cookies.set()或者update()。